﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;
using System.Web;

namespace KAI.Portrait
{
    public class FullAvatarEditorHandler
    {
        private string _store_dir;
        private string _access_base_url;

        public FullAvatarEditorHandler(string storeDir, string accessBaseUrl)
        {
            if (!Directory.Exists(storeDir))
            {
                throw new DirectoryNotFoundException(storeDir);
            }
            if (string.IsNullOrEmpty(accessBaseUrl))
            {
                throw new ArgumentNullException(accessBaseUrl);
            }
            if (!accessBaseUrl.EndsWith("/"))
            {
                accessBaseUrl += "/";
            }
            _store_dir = storeDir;
            _access_base_url = accessBaseUrl;
        }

        public Task Handle(Microsoft.Owin.IOwinContext context, Func<Task> next)
        {
            Result result = new Result();
            result.avatarUrls = new List<string>();
            result.success = false;
            result.msg = "Failure!";

            var httpContext = context.Request.Environment["System.Web.Routing.RequestContext"] as System.Web.Routing.RequestContext;

            var httpRequest = httpContext.HttpContext.Request;

            string fileNameFmt = httpRequest.Form["file_name"];

            //定义一个变量用以储存当前头像的序号
            int avatarNumber = 1;
            //遍历所有文件域
            foreach (string fieldName in httpRequest.Files.AllKeys)
            {
                HttpPostedFileBase file = httpRequest.Files[fieldName];
                //原始图片(file 域的名称：__source，如果客户端定义可以上传的话，可在此处理）。
                if (fieldName == "__source")
                {
                    //文件名，如果是本地或网络图片为原始文件名（不含扩展名）、如果是摄像头拍照则为 *FromWebcam
                    //fileName = file.FileName;
                    //当前头像基于原图的初始化参数（即只有上传原图时才会发送该数据），用于修改头像时保证界面的视图跟保存头像时一致，提升用户体验度。
                    //修改头像时设置默认加载的原图url为当前原图url+该参数即可，可直接附加到原图url中储存，不影响图片呈现。
                    string initParams = httpRequest.Form["__initParams"];
                    result.sourceUrl = string.Format(fileNameFmt, "source");
                    file.SaveAs(httpRequest.MapPath(result.sourceUrl));
                    result.sourceUrl += initParams;
                }
                //头像图片(file 域的名称：__avatar1,2,3...)。
                else if (fieldName.StartsWith("__avatar"))
                {
                    string saveFileName = string.Format(fileNameFmt, avatarNumber);
                    string file_full_name = Path.Combine(_store_dir, saveFileName);
                    CreateDirIfNotExist(file_full_name);
                    file.SaveAs(file_full_name);
                    result.avatarUrls.Add(_access_base_url + saveFileName);
                    avatarNumber++;
                }
                /*
                else
                {
                    如下代码在上传接口Upload.aspx中定义了一个user=xxx的参数：
                    var swf = new fullAvatarEditor('swf', {
                        id: 'swf',
                        upload_url: 'Upload.aspx?user=xxx'
                    });
                    在此即可用Request.Form["user"]获取xxx。
                }
                */
            }
            result.success = true;
            result.msg = "Success!";
            //返回图片的保存结果（返回内容为json字符串，可自行构造，该处使用Newtonsoft.Json构造）
            context.Response.Write(JsonConvert.SerializeObject(result));

            return Task.FromResult(0);
        }

        private static void CreateDirIfNotExist(string file_full_name)
        {
            string dir = Path.GetDirectoryName(file_full_name);
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
        }

        private struct Result
        {
            /// <summary>
            /// 表示图片是否已上传成功。
            /// </summary>
            public bool success;
            /// <summary>
            /// 自定义的附加消息。
            /// </summary>
            public string msg;
            /// <summary>
            /// 表示原始图片的保存地址。
            /// </summary>
            public string sourceUrl;
            /// <summary>
            /// 表示所有头像图片的保存地址，该变量为一个数组。
            /// </summary>
            public IList<string> avatarUrls;
        }
    }

  
}
